package cn.bearspark.user.provider.dao.mapper;

import cn.bearspark.framework.redis.starter.buffer.hash.un.RedisHashMapper;
import cn.bearspark.user.provider.dao.co.UserCO;
import cn.bearspark.user.provider.dao.po.UserBasePO;
import cn.bearspark.user.provider.dao.po.UserIdNamePO;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;
import java.util.Set;

/**
 * 用户基础数据的数据映射接口
 *
 * @author f
 */
@Mapper
public interface UserBaseMapper extends RedisHashMapper<UserCO> {

    /**
     * 统计指定手机号的个数
     *
     * @param phone 指定的手机号
     * @return 指定手机号的记录的个数
     */
    @Select("SELECT COUNT(*) FROM t_user_base WHERE phone = #{phone}")
    int countByPhone(String phone);

    /**
     * 添加用户
     *
     * @param userBasePO 用户的数据对象
     */
    @Insert("INSERT INTO t_user_base (user_id, phone, username, password, avatar_url) " +
            "VALUES (#{userId}, #{phone}, #{username}, #{password}, #{avatarUrl})")
    void insert(UserBasePO userBasePO);

    /**
     * 根据手机号修改密码
     *
     * @param phone    手机号
     * @param password 密码
     */
    @Update("UPDATE t_user_base SET password = #{password} WHERE phone = #{phone}")
    void updatePasswordByPhone(String phone, String password);

    /**
     * 根据 手机号 和 密码 查询用户的 id
     *
     * @param phone    手机号
     * @param password 密码
     * @return 用户的 id
     */
    @Select("SELECT user_id FROM t_user_base WHERE phone = #{phone} AND password = #{password}")
    Long getIdByPhoneAndPassword(String phone, String password);

    /**
     * 根据用户名的集合获取用户 id 的集合
     *
     * @param usernameList 用户名的集合
     * @return 用户 id 与 用户名 的集合
     */
    List<UserIdNamePO> listIdNameByNameList(List<String> usernameList);

    /**
     * 根据用户 id 的集合获取用户 id 的集合
     *
     * @param userIdList 用户 id 的集合
     * @return 用户 id 与 用户名 的集合
     */
    List<UserIdNamePO> listIdNameByIdList(List<Long> userIdList);

    @Override
    List<UserCO> listHotData(Set<Long> idSet);

    @Override
    List<UserCO> listData(List<Long> idList);

    /**
     * 增加指定用户的动态数
     *
     * @param userId 指定的用户 id
     */
    @Update("UPDATE t_user_base SET happening_num = happening_num + 1 WHERE user_id = #{userId}")
    void incrHappeningNum(long userId);

    /**
     * 减少指定用户的动态数
     *
     * @param userId 指定的用户 id
     */
    @Update("UPDATE t_user_base SET happening_num = happening_num - 1 WHERE user_id = #{userId}")
    void decrHappeningNum(long userId);

    /**
     * 更新用户的动态数
     *
     * @param userId       用户 id
     * @param happeningNum 用户动态数
     * @return 更新操作影响的行数
     */
    @Update("UPDATE t_user_base SET happening_num = #{happeningNum} " +
            "WHERE user_id = #{userId} AND happening_num != #{happeningNum}")
    int updateHappeningNum(long userId, long happeningNum);
}
